package com.xltq.service.impl;

import com.xltq.dao.ICartDao;
import com.xltq.dao.IOrdersDao;
import com.xltq.dao.impl.ICartDaoImpl;
import com.xltq.dao.impl.IOrdersDaoImpl;
import com.xltq.entity.Cart;
import com.xltq.entity.Item;
import com.xltq.entity.Orders;
import com.xltq.service.IOrdersService;
import com.xltq.utils.RandomUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class IOrdersServiceImpl implements IOrdersService {
    @Override
    public void createOrder(String aid, String uid, String sum) throws Exception {
            //创建订餐的时候,订单中是需要存在订单项(订单中要有商品)
        //1.创建一个订单对象并进行保存
        Orders orders = new Orders();
        BigDecimal bsum = new BigDecimal(sum);//金额
        //产生订单号
        String orderId = RandomUtils.createOrderId();
        orders.setOid(orderId);
        orders.setAid(Integer.valueOf(aid));
        orders.setUid(Integer.valueOf(uid));
        orders.setOtime(new Date());
        orders.setOcount(bsum);
        /**
         * 在设计订单状态 0 未付款，1已经付款未发货 2发货待收货 3 收货待评价 4订单完成 5 退货状态
         * 前端页面中使用存储是 4 值
         * 1 未支付 2已支付,代发货 3 已发货,待收货 4订单完成
         * 最终数据是要传递给前端的-->出现了这个问题的原因就是
         * 前后端 字段 没有对接情况 (联合项目的时候一定将字段定义)
         * 以4个值为主
         */
        orders.setOstate(1); // 未支付的状态
        //2.保存订单信息
        IOrdersDao ordersDao = new IOrdersDaoImpl();
        ordersDao.insertOrders(orders);

        //3.将购物车中商品信息转换为订单项
        ICartDao cartDao = new ICartDaoImpl();
        List<Cart> carts = cartDao.selectCartByUid(Integer.valueOf(uid));

        //在Orders订单实体类存在着两个属性值
        /**
         * 一个用户地址信息Address  另一个存这个购物中商品转换完订单项list集合
         */
        List<Item> items = new ArrayList<>();
        //将购物车中该商品信息转存到item订单项中
        for(Cart cart : carts){
            Item item = new Item();
            item.setOid(orderId);
            item.setPid(cart.getPid());
            item.setInum(cart.getCnum());
            item.setIcount(cart.getCcount());
            items.add(item);
        }
        //保存订单项到对应订单中
        ordersDao.insertItems(items);
        //订单已经生成了,购物车中购物数据信息就不需要了
        cartDao.deleteCartByUid(Integer.valueOf(uid));

    }

    @Override
    public List<Orders> findOrdersByUid(int uid) throws Exception {
        IOrdersDao ordersDao = new IOrdersDaoImpl();
        //所有订单信息
        List<Orders> ordersList = ordersDao.selectOrdersByUid(uid);
        return ordersList;
    }

    @Override
    public Orders findOrdersByOid(String oid) throws Exception {
        IOrdersDao ordersDao = new IOrdersDaoImpl();
        //根据oid获取订单和地址
        Orders orders = ordersDao.selectOrdersByOid(oid);
        //在通过oid拿到订单中订单项(拿到订单中详细商品信息)
        List<Item> items = ordersDao.selectItemsByOid(oid);
        //需要将订单项信息添加到订单实体对象中,以便外界可以直接操作订单对象既可以获取到
        //地址 订单编号 和 订单中商品信息(订单项)
        orders.setItems(items);
        return orders;
    }

    @Override
    public void updateStateByOid(String oid, String state) throws Exception {
        IOrdersDao ordersDao = new IOrdersDaoImpl();
        ordersDao.updateStateByOid(oid, state);
    }
}
